﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Web.UI;
using System.ComponentModel;
using System.Web;
using PagamentoDigital.Properties;
using System.Collections.Specialized;
using System.Globalization;

namespace PagamentoDigital {

    [AspNetHostingPermission(System.Security.Permissions.SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)]
    [Description("Possibilita efetuar uma venda através do Pagamento Digital")]
    [DefaultProperty("EmailCobranca")]
    [Designer(typeof(Design.VendaPagamentoDigitalDesigner))]
    public class VendaPagamentoDigital : Control {

        private string _url;

        private Comportamento _comportamento;

        private bool _redirect;
        private string _redirectUrl;

        private string _email;

        private MeioPagamento _meioPagamento;
        private double _frete;
        private double _desconto;
        private double _acrescimo;
        private int _maxParcelas;

        private Cliente _cliente;
        private IList<Produto> _produtos;
        private IList<Dependente> _dependentes;

        private string _idPedido;
        private string _free;
        private string _tipoFrete;

        /** Properties **/

        public string Url {
            get {
                return _url;
            }
            set {
                _url = value;
            }
        }

        public Comportamento Comportamento {
            get {
                return _comportamento;
            }
            set {
                _comportamento = value;
            }
        }

        public bool Redirect {
            get {
                return _redirect;
            }
            set {
                _redirect = value;
            }
        }
        public string RedirectUrl {
            get {
                return _redirectUrl;
            }
            set {
                _redirectUrl = value;
            }
        }

        public string Email {
            get {
                return _email;
            }
            set {
                _email = value;
            }
        }

        public MeioPagamento MeioPagamento {
            get {
                return _meioPagamento;
            }
            set {
                _meioPagamento = value;
            }
        }
        public double Frete {
            get {
                return _frete;
            }
            set {
                _frete = value;
            }
        }
        public double Desconto {
            get {
                return _desconto;
            }
            set {
                _desconto = value;
            }
        }
        public double Acrescimo {
            get {
                return _acrescimo;
            }
            set {
                _acrescimo = value;
            }
        }
        public int MaxPercelas {
            get {
                return _maxParcelas;
            }
            set {
                _maxParcelas = value;
            }
        }

        public Cliente Cliente {
            get {
                return _cliente;
            }
            set {
                _cliente = value;
            }
        }
        public IList<Produto> Produtos {
            get {
                return _produtos;
            }
            set {
                _produtos = value;
            }
        }
        public IList<Dependente> Dependentes {
            get {
                return _dependentes;
            }
            set {
                _dependentes = value;
            }
        }

        public string IdPedido {
            get {
                return _idPedido;
            }
            set {
                _idPedido = value;
            }
        }
        public string Free {
            get {
                return _free;
            }
            set {
                _free = value;
            }
        }
        public string TipoFrete {
            get {
                return _tipoFrete;
            }
            set {
                _tipoFrete = value;
            }
        }

        public VendaPagamentoDigital() {
            this._url = Resources.PagamentoDigital_Checkout;
            this._comportamento = Comportamento.Redirecionar;
            this._meioPagamento = MeioPagamento.DefinidoPeloCliente;
            this._maxParcelas = 1;
            this._produtos = new List<Produto>();
            this._dependentes = new List<Dependente>();
            this._redirect = false;
        }

        public VendaPagamentoDigital(string email)
            : this() {
            this._email = email;
        }

        public void Executar(System.Web.HttpResponse response) {
            response.ContentEncoding = Encoding.GetEncoding("iso-8859-1");

            StringBuilder sb = new StringBuilder();
            sb.Append("<html>");
            sb.Append("<head>");
            sb.AppendFormat("<meta http-equiv=\"content-type\" content=\"text/html; charset={0}\">", response.ContentEncoding.BodyName);
            sb.Append("</head>");
            sb.Append("<body onLoad=\"document.forms[0].submit()\">");
            sb.AppendFormat("<form name=\"formPagamentoDigital\" target=\"" + (this.Comportamento == Comportamento.Redirecionar ? "_self" : "PagamentoDigital") + "\" action=\"{0}\" method=\"post\">", this._url);

            //Ajustes necessários para a formatação correta dos dados
            CultureInfo culture = new CultureInfo("pt-BR", false);
            culture.NumberFormat.NumberDecimalSeparator = ".";
            culture.NumberFormat.NumberGroupSeparator = string.Empty;
            culture.NumberFormat.PercentDecimalSeparator = ".";
            culture.NumberFormat.PercentGroupSeparator = string.Empty;

            NameValueCollection parametros = this.GetParametros(culture);
            foreach (string chave in parametros.AllKeys) {
                sb.AppendFormat("<input type=\"hidden\" name=\"{0}\" value=\"{1}\">", chave, HttpUtility.HtmlEncode(parametros[chave]));
            }

            sb.Append("</form>");
            sb.Append("</body>");
            sb.Append("</html>");
            response.Write(sb.ToString());
            if (this.Comportamento == Comportamento.Redirecionar) {
                response.End();
            }
        }

        public NameValueCollection GetParametros(CultureInfo culture) {
            NameValueCollection nvc = new NameValueCollection();
            nvc.Add("email_loja", this._email);
            nvc.Add("tipo_integracao", "PAD");
            nvc.Add("frete", string.Format(culture, "{0:0.00}", this._frete));
            nvc.Add("tipo_frete", this._tipoFrete);
            nvc.Add("desconto", string.Format(culture, "{0:0.00}", this._desconto));
            nvc.Add("acrescimo", string.Format(culture, "{0:0.00}", this._acrescimo));
            nvc.Add("redirect", this._redirect ? "true" : "false");
            nvc.Add("url_retorno", this._redirect ? this._redirectUrl : string.Empty);
            nvc.Add("meio_pagamento", string.Format(culture, "{0}", (int)this._meioPagamento));

            if (this._cliente != null) {
                nvc.Add(this._cliente.GetParametros(culture));
            }

            for (int i = 0; i < this._dependentes.Count; i++) {
                nvc.Add(this._dependentes[i].GetParametros(culture, i + 1));
            }

            for (int i = 0; i < this._produtos.Count; i++) {
                nvc.Add(this._produtos[i].GetParametros(culture, i + 1));
            }

            return nvc;
        }

    }

    public enum Comportamento {
        NovaPagina,
        Redirecionar
    }

    public enum MeioPagamento {
        DefinidoPeloCliente = 0,
        Visa = 1,
        Mastercard = 2,
        AmericanExpress = 37,
        AURA = 45,
        Diners = 55,
        Hipercard = 56,
        Boleto = 10,
        OnlineBancoDoBrasil = 58,
        OnlineBancoBradesco = 59,
        OnlineBancoItau = 60
    }
}
